#include <iostream>
using namespace std;
// 在多态中，通常父类中的虚函数的实现是毫无意义的，主要都是调用子类重写的内容
// 因此可以将虚函数的实现设置为纯虚函数
// 纯虚函数语法：virtual 返回值类型 函数名(参数列表) = 0;
// 当类中有了纯虚函数，这个类也称为抽象类

// 抽象类的特点：
//  1.不能实例化对象
//  2.子类必须重写父类中的纯虚函数，否则子类也会变成抽象类

class Base {
   public:
    // 纯虚函数
    // 纯虚函数没有函数体
    // 纯虚函数的作用是让子类必须重写这个函数
    virtual void func() = 0;  // 纯虚函数没有函数体
};

class Son : public Base {
   public:
    // 重写父类中的纯虚函数
    virtual void func() { cout << "Son func" << endl; };
};

void test1() {
    // Base b; // 不能实例化对象
    // Base *pb = new Base(); // 不能实例化对象
    // Son s; // 子类必须重新父类中的纯虚函数，否则无法实例化对象
    // s.func();
    Base* pb = new Son();  // 父类指针指向子类对象
    // 通过父类指针调用子类对象的函数
    pb->func();  // Son func
    // 通过父类指针调用父类对象的函数
    // pb->Base::func(); // error: 'class Base' has no member named 'func'
    // 通过父类指针调用子类对象的函数
    // pb->Son::func(); // error: 'class Base' has no member named 'Son'
    // 通过父类指针调用子类对象的函数
    // pb->func(); // Son func
}

int main() {
    test1();
    system("pause");
    return 0;
}